;(function($){
    /**
     * 为了不影响以前的功能，将datagrid进行复制一份  -limy  --2021-01-12
     * @description
     *      重写了渲染多选的复选框方法
     *      添加了存储搜索到的数据、存储搜索不到的数据、存储全选状态的字段，并提供了对应的方法
     *      添加了最终数据，将原先组件里的data里的数据当成是展示数据   -limy --2021-09-08
     */
    $.widget("tempo.datagrid_page",$.tempo.datagrid,{
        options:{
            // 存储搜索到的数据 -- 分页优化，在有搜索时，点击保存，为了不影响历史功能
            searchResult: [],
            // 存储搜索不到的数据
            noSearchResult: [],
            // 存储全选状态
            allSelectCheckboxStatus: false,
            // 最终数据
            finalData: [],
            // 由于点击事件被修改，所以将此方法添加此方法进行传递
            selfOnselectRow:function(rowId,status,rowData){},
            // 由于点击事件被修改，所以将此方法添加此方法进行传递
            udfOnSelectRow: function(rowId,status){},
            // 此方法主要是判断点击一行时，是否进入编辑状态
            udfBeforeSelectRow:function(){
                return true;
            }
        },
        // 因为此方法有datagrid总是报错，复制过来进行修改
        //渲染下拉菜单
        _renderSelectmenu:function(model,idx){
            var editoptions = model.editoptions,
                data = editoptions.data,
                that = this;
            delete editoptions.data;
            var getSelect = function(val,rowData,rowId){
                var dt = data;
                if($.isFunction(data)){
                    dt = data.call(this.element,rowData,rowId);
                }
                dt = dt||[];
                var ele = $("<select/>");
                for(var i=0,len=dt.length;i<len;i++){
                    $("<option/>",{
                        value:dt[i].id,
                        checked:i===0,
                        text:dt[i].text,
                        disabled:dt[i].disabled||false
                    }).appendTo(ele);
                }
                return ele;
            }.bind(this);


            model.editoptions = {
                custom_element:function(editoptions){
                    return function(val,row){
                        var rowData = $(this).datagrid_page("getRowData",row.rowId);
                        var select = getSelect(val,rowData,row.rowId);
                        var rowId = row.rowId;
                        var change = editoptions.change||$.noop;
                        if(!editoptions.editable && val !== undefined && val!==null && val!==""){
                            select.val(val);
                        }
                        setTimeout(function(){
                            select.selectmenu($.extend(
                                {},editoptions,{
                                    change:function(e,ui){
                                        change.call(that.element,e,ui,rowId);
                                    }
                                }
                            ));
                            if(editoptions.editable){
                                select.selectmenu('setValue', val);
                            }
                        },0);
                        return select;
                    }
                }(editoptions),
                custom_value:function(ele,e){
                    return ele.val();
                }
            }
        },
        //渲染多选的复选框
        _rendercbox:function(){
            var that = this;
            if(this.gridcontainer.find(".cbox") && this.gridcontainer.find(".cbox").length > 0){
                if (this.options.isRendercboxClass) {
                    this.gridcontainer.find(".cbox").checkbox({
                        nolabel:true
                    })
                        .next("label")
                        .bind("click",function(e){
                            e.preventDefault();
                            e.stopImmediatePropagation();
                            // 获取当前选中的复选框对象
                            var checkboxInput = $(this).prev();

                            // 如果是全选复选框  全局复选框以cd_开头  字段的复选框以jqg_开头
                            if (checkboxInput.attr("id").startsWith("cb_")) {
                                // 判断是否禁用
                                if (checkboxInput[0].disabled) {
                                    return false;
                                }
                                // 将当前页编辑状态下的数据进行保存
                                var currentRowIds = that.getRowIds();
                                if (currentRowIds != null && currentRowIds.length != 0){
                                    currentRowIds.forEach(
                                        function (id) {
                                            // 保存修改的行数据
                                            that.saveRow(id);
                                        }
                                    );
                                }

                                // 将当前页数据，同步到最终数据里面
                                var currentRowData =  that.getRowData();
                                var rightTableFinalData = that.getAllData();
                                var rightTableFinalDataLen = rightTableFinalData.length;
                                for (var i=0; i<rightTableFinalDataLen; i++) {
                                    currentRowData.forEach(
                                        function (temp) {
                                            if (rightTableFinalData[i].id == temp.id) {
                                                rightTableFinalData[i] = temp;
                                            }
                                        }
                                    );
                                }
                                that.setAllData(rightTableFinalData);

                                // 获取原先的全选状态
                                var oldSelectedStatus = checkboxInput.is(":checked");
                                // 点击之后全选应该展示的状态
                                var selectedStatus = oldSelectedStatus ? false : true;
                                // 将全选状态进行储存起来
                                that.options.allSelectCheckboxStatus = selectedStatus;

                                // 将当前页数据同步到展示数据里面，并修改展示数据的选中状态
                                var rightTableShowData = that.getShowData();
                                var rightTableShowDataLen = rightTableShowData.length;
                                for (var i=0; i<rightTableShowDataLen; i++) {
                                    currentRowData.forEach(
                                        function(temp){
                                            if (rightTableShowData[i].id == temp.id){
                                                rightTableShowData[i] = temp;
                                            }
                                        }
                                    );
                                    // 修改选中状态
                                    rightTableShowData[i].isSelected = selectedStatus;
                                }
                                that.setShowData(rightTableShowData);

                                // 清空页面展示
                                that.clearGridData();
                                // 在页面展示处理好的数据
                                that.setGridParam({datatype:'local',data: rightTableShowData});
                                that.element.trigger("reloadGrid");
                            } else {
                                // 如果单个选中
                                // 先触发复选框点击事件
                                $(this).prev().trigger("click");
                                // 将当前页编辑状态下的数据进行保存
                                var currentRowIds = that.getRowIds();
                                if (currentRowIds != null && currentRowIds.length != 0){
                                    currentRowIds.forEach(
                                        function (id) {
                                            // 保存修改的行数据
                                            that.saveRow(id);
                                        }
                                    );
                                }

                                // 获取选中行id
                                var rowId = $(this).parent().parent().attr('id');
                                // 获取选中行内容
                                var selectRowData = that.element.jqGrid("getRowData",rowId);
                                // 将当前的选中状态添加进去
                                selectRowData.isSelected = $(this).parent().parent().attr('aria-selected') == "true" ? true : false;
                                that.element.jqGrid("setRowData",rowId, selectRowData);

                                // 将当前页数据，同步到最终数据里面
                                // 场景：修改了页面上的数据之后，在选中某一行
                                var currentRowData =  that.getRowData();
                                var rightTableFinalData = that.getAllData();
                                var rightTableFinalDataLen = rightTableFinalData.length;
                                for (var i=0; i<rightTableFinalDataLen; i++) {
                                    currentRowData.forEach(
                                        function (temp) {
                                            if (rightTableFinalData[i].id == temp.id) {
                                                rightTableFinalData[i] = temp;
                                            }
                                        }
                                    );
                                }
                                that.setAllData(rightTableFinalData);

                                // 将当前页面数据同步到展示数据里面，并确定是否全部被选中
                                var allSelectSatusFlag = true;
                                var rightTableShowData = that.getShowData();
                                var rightTableShowDataLen = rightTableShowData.length;
                                for (var i=0; i<rightTableShowDataLen; i++) {
                                    currentRowData.forEach(
                                        function(temp){
                                            if (rightTableShowData[i].id == temp.id){
                                                rightTableShowData[i] = temp;
                                            }
                                        }
                                    );
                                    // 判断是否是全选
                                    if (rightTableShowData[i].isSelected + "" != "true") allSelectSatusFlag = false;
                                }
                                that.setShowData(rightTableShowData);

                                // 判断要不要更新全选状态
                                if (allSelectSatusFlag) {
                                    that.element.parent().parent().prev().find("input[id^=cb_]")[0].checked = true
                                }
                                // 将全选状态进行储存起来
                                that.options.allSelectCheckboxStatus = allSelectSatusFlag;
                                if(that.options.udfBeforeSelectRow()){
                                    // 进入编辑行状态
                                    that.element.jqGrid("editRow", rowId, true, that.options.oneRowEdit);
                                }
                                // 由于点击事件被修改，所以将此方法添加此方法进行传递
                                that.options.selfOnselectRow(rowId, selectRowData.isSelected, selectRowData);
                                // 由于点击事件被修改，所以将此方法添加此方法进行传递
                                that.options.udfOnSelectRow(rowId,selectRowData.isSelected);
                            }
                        })
                        .closest("td,th").addClass("tempo-datagrid-cbox-container");
                } else {
                    this.gridcontainer.find(".cbox")
                        .next("label")
                        .bind("click",function(e){
                            e.preventDefault();
                            e.stopImmediatePropagation();
                            $(this).prev().trigger("click");
                        })
                        .closest("td,th").addClass("tempo-datagrid-cbox-container");
                }
            }
        },

        /**
         * 获取搜索栏搜索到的数据
         * @returns 数据 数组
         */
        getSearchResult : function() {
            return this.options.searchRemoveResult || [];
        },
        /**
         * 设置搜索栏搜索到的数据
         * @param newData 数据
         */
        setSearchResult : function(newData) {
            if (!newData) return;
            this.options.searchRemoveResult = newData;
        },
        /**
         * 获取搜索栏搜索不到的数据
         * @returns 数据 数组
         */
        getNoSearchResult : function() {
            return this.options.noSearchResult || [];
        },
        /**
         * 设置搜索栏搜索不到的数据
         * @param newData 数据
         */
        setNoSearchResult : function(newData) {
            if (!newData) return;
            this.options.noSearchResult = newData;
        },
        /**
         * 获取全选复选框的状态
         * @returns {boolean} true全选  false没有全选
         */
        getAllSelectCheckboxStatus : function(){
            return this.options.allSelectCheckboxStatus ||false;
        },
        /**
         * 清除全选复选框的状态
         */
        clearAllSelectCheckboxStatus : function(){
            this.options.allSelectCheckboxStatus = false;
        },
        /**
         * 重写
         * 获取所有数据--分页也适用
         */
        getAllData:function(){
            return this.options.finalData || [];
        },
        /**
         * 重写
         * 设置新的所有数据
         * @param newData
         */
        setAllData:function(newData){
            if (!newData) return;
            this.options.finalData = newData;
        },
        /**
         * 获取展示的数据--分页也适用
         */
        getShowData:function(){
            return this.options.data || [];
        },
        /**
         * 设置展示的数据
         * @param showData 要展示的数据
         */
        setShowData : function (showData) {
            if (!showData) return;
            this.options.data = showData;
        }
    });
}(jQuery));